package com.nus.frogworks;

import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;

import android.location.Location;
import android.os.Environment;
import android.os.SystemClock;

public class HistoricalDataWrapper implements DataInputWrapper {

	private long startTime;
	private long lastLogTime;
	private long lastBackupTime;
	
	StringBuilder logUpdate;
	
	private final int MAX_BATTERY_CAPACITY = 2000;
	
	private double initialCapacity;
	private double batteryCapacity;
	private double chargeConsumed;
	private double latestCurrent;
	
	private ArrayList<Integer> _timeList = new ArrayList<Integer>();
	
	private final int BYTES_IN_INT = 4;
	private final int BITMASK = 0x000000FF;
	private final int BITS_IN_BYTE = 8;
	
	private final char LOG_COL_DELIMITER = ',';
	private final char LOG_ROW_DELIMITER = '\n';
	
	private int logFrequency = 100; //in milliseconds
	private int backupFrequency = 18000;

	private final String TIME_TITLE = "Time / ms";
	private final String SPEED_TITLE = "Speed / kmph";
	private final String CURRENT_TITLE = "Current / A";
	private final String VOLTAGE_TITLE = "Voltage / V";
	private final String MOTOR_TITLE = "Motor Temp / C";
	private final String AMBIENT_TITLE = "Ambient Temp / C";
	private final String BATTERY_TITLE = "Battery Temp / C";
	private final String CONTROLLER_TITLE = "Controller Temp / C";
	
	private final String LATITUDE_TITLE = "Latitude / Deg";
	private final String LONGITUDE_TITLE = "Longitude / Deg";
	private final String ALTITUDE_TITLE = "Altitude / m";
	
	private boolean toLog = false;
	private boolean logLocation = false;
	
	private Location location;
	
	StringBuilder outputStr;
	
	private File logFile;
	
	private final double[] speedValues = 
		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.64,0.64,1.28,1.28,1.91,1.28,1.28,1.28,1.28,0.64,0.64,0.64,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,1.91,5.74,10.21,16.6,43.4,60,64.47,67.66,67.02,44.68,30,24.25,18.51,13.4,8.94,5.11
			,2.55,0.64,0,0,0,0.64,2.55,4.47,6.38,8.94,10.85,11.49,12.13,12.77,14.04,17.23,19.79,23.62,28.08,31.91,
			34.47,38.94,42.76,44.04,45.32,44.68,40.85,35.11,29.36,22.98,17.23,12.77,10.21,9.57,8.3,8.3,8.3,7.02,
			5.74,5.11,3.19,1.91,1.28,0.64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.64,2.55,
			4.47,5.74,6.38,5.74,3.83,1.91,0.64,0,0,0,0,0,0.64,2.55,4.47,6.38,8.94,10.85,10.85,10.21,10.21,9.57,8.3,
			8.94,9.57,8.3,6.38,5.11,2.55,0.64,0,0,0.64,0.64,0.64,0.64,0.64,0,0,0,0,0,0,0,0,0,0,0,0,0.64,0.64,
			0.64,0.64,1.28,1.28,1.91,2.55,2.55,6.38,7.66,8.3,8.94,8.94,4.47,2.55,1.28,0,0,0,0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.28,3.19,5.74,8.94,12.77,17.23,21.06,23.62,26.17,28.72,28.08,26.81,26.17,
			24.25,20.42,17.87,15.32,13.4,12.13,12.77,13.4,14.68,14.04,13.4,10.85,8.3,5.74,3.83,1.91,1.28,0.64,
			0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.28,2.55,3.83,5.11,5.74,5.74,6.38,6.38,6.38,7.02,7.66,7.02,7.66,7.66,
			7.66,7.02,7.02,6.38,6.38,7.02,7.02,7.02,6.38,6.38,5.74,5.11,5.11,6.38,6.38,6.38,6.38,5.74,5.11,4.47,
			5.11,5.74,5.74,6.38,7.66,7.02,6.38,6.38,5.11,5.11,5.11,6.38,7.66,10.21,12.77,15.32,17.23,17.23,16.6,
			14.04,11.49,8.3,7.66,7.02,7.66,9.57,12.77,15.96,17.87,17.87,17.23,15.96,13.4,11.49,11.49,11.49,12.13,
			15.96,19.15,21.7,22.34,22.34,19.15,16.6,13.4,11.49,8.94,7.66,5.74,5.11,3.83,3.83,2.55,1.91,0.64,0.64,
			0,0,0,0,0,0.64,0.64,0.64,1.28,1.28,0.64,0.64,0.64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.28,1.91,3.83,5.11,
			5.74,5.11,5.11,3.83,3.83,3.83,3.83,3.83,3.19,1.91,1.28,1.28,0.64,0.64,0.64,0.64,0,0,0,0.64,1.28,
			1.91,1.91,2.55,2.55,3.19,3.19,3.19,3.19,2.55,1.91,1.91,1.91,1.28,1.28,0.64,0.64,1.28,1.91,2.55,3.19,
			2.55,2.55,1.91,1.28,1.28,1.28,0.64,1.28,1.28,0.64,0.64,0.64,0,0,0,0,0,0,0,0,0,0,0.64,0.64,0.64,0.64,
			0.64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.64,0.64,0.64,1.28,1.28,
			1.28,1.91,2.55,1.91,2.55,1.91,1.28,0.64,1.91,1.91,2.55,2.55,3.83,3.83,5.11,7.66,12.13,14.68,17.23,17.23,
			15.32,11.49,7.66,4.47,3.19,2.55,2.55,2.55,3.19,3.19,3.83,3.83,4.47,3.83,3.83,3.19,3.19,3.19,2.55
			,1.91,1.28,0.64,0,1.28,3.19,3.83,4.47,5.74,5.11,4.47,4.47,4.47,3.83,3.19,2.55,2.55,1.91,1.28,1.28,1.28,
			0.64,0.64,1.28,1.28,0.64,0.64,1.28,1.28,1.28,1.91,2.55,2.55,3.19,3.19,2.55,1.91,1.91,0.64,1.28,1.91,
			1.91,1.91,2.55,1.91,1.28,1.28,0.64,0.64,0.64,0.64,0.64,0.64,0,0,0,0,0.64,0.64,0.64,0.64,0.64,0,0,
			0,0,0,0,0,0,0,0,0,0};
	
	private final double[] voltageValues = 
		{51.28,51.29,51.28,51.29,51.29,51.29,51.29,51.29,51.29,51.29,51.3,51.3,51.29,51.3,51.3,51.3,51.3,51.3
			,51.3,51.3,51.3,51.3,51.3,51.3,51.3,51.3,51.29,51.3,51.3,51.31,51.3,51.31,51.31,51.31,51.31,51.31,51.31,
			51.31,51.31,51.31,51.3,45.46,39.01,36.26,32.8,29.62,34.48,54.64,54.56,53.81,53.01,51.85,51.56,51.39,
			51.28,51.2,51.15,51.11,51.08,51.06,51.04,51.03,42.84,48.99,49.57,50,50.05,49.86,50.39,50.46,47.74,
			38.02,35.9,33.96,32.91,29.55,30.57,32.27,33.71,47.84,43.79,48.57,53.85,52.95,51.53,50.82,50.65,50.39,
			50.53,50.51,50.07,50.06,50.06,50.43,50.44,50.47,50.48,50.5,50.51,50.52,50.54,50.54,50.56,50.56,50.57,
			50.58,50.59,50.6,50.6,50.61,50.62,50.62,50.63,50.63,50.64,50.65,50.65,50.66,50.66,50.67,50.67,50.68,
			50.68,50.69,50.69,50.69,50.7,50.71,50.71,50.72,50.72,50.72,50.73,50.73,50.74,50.74,50.74,50.75,50.75,
			50.75,50.76,50.76,50.77,50.77,50.77,50.77,50.78,50.78,50.78,50.78,50.79,50.79,50.79,50.79,50.8,
			50.8,50.81,50.81,50.81,50.81,50.82,50.82,50.82,50.82,50.82,50.83,50.83,50.83,50.83,50.84,50.84,50.84
			,50.84,50.84,50.84,50.85,50.85,50.85,50.85,50.85,50.85,50.86,50.86,50.87,50.86,50.87,50.87,50.87,50.87,
			50.87,50.88,50.88,50.88,50.88,50.88,50.88,50.88,50.87,50.89,50.89,50.89,50.89,50.89,50.9,50.9,50.9,
			50.9,50.91,50.9,50.9,50.91,50.91,50.91,50.91,50.91,50.91,50.91,50.92,50.92,50.92,50.92,50.92,50.92
			,50.93,50.92,50.93,50.93,50.93,50.93,50.93,48.98,50.51,50.6,50.77,50.8,50.82,50.84,50.85,50.86,50.87
			,50.88,50.88,50.89,50.9,50.9,47.87,48.58,48.83,49.29,49.39,49.03,48.88,49,48.49,49.26,49.47,49.67,50.33,
			50.46,50.53,50.58,50.62,50.65,50.67,50.69,50.7,50.72,50.73,50.74,50.75,50.76,50.77,50.78,50.78,50.79,
			50.79,50.8,50.8,50.81,50.82,50.82,50.82,50.83,50.06,45.35,48.49,48.43,46.62,50.18,42.11,41.43,46.91,
			50.09,50.26,50.35,50.41,50.46,50.49,50.52,50.54,50.56,50.57,50.59,50.6,50.62,50.63,50.64,50.65,
			50.66,50.66,50.67,50.68,50.69,50.69,50.69,50.71,50.71,50.71,50.72,50.72,50.73,50.73,50.74,50.74,50.75,
			50.75,40.99,39.54,38.43,36.95,35.82,35.17,33.66,33.3,32.54,33.66,48.23,49.42,49.35,48.71,48.42,50.15,
			47.94,47.51,48,48.35,48.86,49.56,50.18,50.04,50.1,50.13,50.16,50.18,50.2,50.21,50.23,50.24,50.26,
			50.27,50.28,50.29,50.3,50.31,50.32,50.33,50.34,50.34,50.35,50.36,50.37,50.37,50.38,50.38,50.39,50.4,
			50.4,50.4,50.41,50.41,50.42,50.43,50.43,50.44,50.44,50.45,50.45,50.45,50.46,50.46,50.47,50.47,50.47,
			50.48,50.48,50.49,50.49,50.49,50.49,50.5,50.5,50.5,50.5,50.51,50.51,50.52,50.52,50.52,50.53,50.53,50.53,
			50.53,50.54,50.54,50.54,50.54,50.54,50.55,50.55,50.55,50.25,49.69,49.89,49.86,49.9,49.97,50.11,50.13,
			50.21,50.19,50.19,50.07,50.08,50.08,50.18,50.15,50.18,50.13,50.12,50.15,50.13,50.12,50.14,50.12
			,50.13,50.09,50.09,50.05,50.06,50.1,50.09,50.07,50.03,50.04,50.04,49.98,50.01,49.98,50.03,50.02,50,50.06,
			49.98,50.01,50.29,50.12,50.15,49.85,46.7,37.38,34.98,50.43,50.05,50.06,50.3,50.18,50.29,50.15,49.37,
			49.53,43.39,44,47.63,49.95,50.66,50.26,50.48,50.44,49.93,49.34,49.8,49.65,36.54,34.47,32.1,49.09,
			49.71,49.77,49.61,49.62,49.64,49.55,49.33,48.99,49.95,50.02,50.06,50.09,50.11,50.13,50.15,50.16,50.17,
			50.18,50.19,50.2,50.22,50.22,50.23,50.24,50.24,50.25,50.26,50.26,50.27,50.28,50.28,50.29,50.29,50.3,
			50.3,50.31,50.31,50.3,50.32,50.32,50.33,50.33,50.34,48.7,48.32,49.59,50.05,50.15,50.2,49.99,49.97,
			49.91,50.2,50.24,50.26,50.28,50.29,50.31,50.31,50.32,50.33,50.34,50.34,50.35,50.35,50.36,50.36,50.37,
			50.37,50.38,50.38,50.38,50.38,50.39,50.39,50.4,50.4,50.4,50.41,50.41,50.41,50.41,50.41,50.41,50.42,
			50.42,50.43,50.43,50.43,50.43,50.43,50.43,50.44,50.44,50.44,50.44,50.45,50.44,50.45,50.45,50.45,50.45,
			50.46,50.46,50.46,50.46,50.46,50.46,50.47,50.47,50.47,50.47,50.47,50.47,50.47,50.47,50.47,50.48,
			50.47,50.48,50.48,50.49,50.49,50.49,50.49,50.49,50.49,50.49,50.49,50.49,50.5,50.5,50.5,50.5,50.5,50.5,
			50.5,50.5,50.51,50.51,50.51,50.51,50.51,50.51,50.51,50.51,50.51,50.51,50.52,50.52,50.52,50.52,50.52,
			50.52,50.53,50.52,50.53,50.53,50.53,50.53,50.53,50.53,50.53,49.28,50.09,50.26,50.33,50.22,47.09,48.84,
			45.1,36.05,32.9,49.65,50.07,50.06,50.1,50.13,50.15,50.19,50.2,50.22,50.23,50.25,50.25,50.28,50.27,
			50.29,50.29,50.3,50.31,50.32,50.32,50.33,50.34,50.34,50.35,50.35,50.35,46,49.26,49.36,48.82,48.67,
			49.9,50.06,50.12,50.16,50.2,50.22,50.24,50.25,50.27,50.28,50.29,50.3,50.31,50.31,50.32,50.33,50.34,
			50.34,50.34,50.35,50.35,50.36,50.35,49.84,49.9,50.24,50.29,50.04,50.06,50.1,50.11,50.12,50.09,50.09,
			50.03,50.03,49.98,50.26,50.3,50.32,50.33,50.35,50.35,50.37,50.37,50.38,50.38,50.38,50.39,50.39,50.4,
			50.4,50.41,50.41,50.41,50.41,50.41,50.42,50.42,50.42,50.43,50.43,50.43,50.43,50.43,50.44,50.44,50.44,
			50.44,50.44,50.44,50.44,50.45,50.45,50.45,50.45,50.45,50.46,50.46,50.46,50.46,50.46,50.46,50.46,
			50.46,50.47,50.47,50.47,50.47,50.47,50.47,50.47,50.47,50.47,50.48,50.48,50.48,50.48,50.48,50.49,50.49,
			50.49,50.49,50.49,50.49,50.49,50.49,50.49,50.49,50.49,50.5,50.5,50.5,50.5,50.5,50.5,50.49,50.5,50.5,50.5,
			50.51,50.5,50.5,50.51,50.51,50.5,50.51,50.51,50.51,50.51,50.51,50.51,50.51,50.51,50.51,50.51,50.51,
			50.52,50.52,50.52,50.52,50.52,50.52,50.52,50.52,50.52,50.52,50.52,50.52,50.53,50.53,50.53,50.53,50.53,
			50.53,50.53,50.53,50.51,50.53,50.53,50.53,50.53,50.54,50.53,50.54,50.54,50.54,50.54,50.54,50.54,
			50.54,50.54,50.54,50.54,50.54,50.54,50.54,50.54,50.54,50.54,50.54,50.54,50.54,50.54,50.55,50.55,50.55,
			50.55,50.55,50.55,50.55,50.55,50.55,50.55,50.55,50.55,50.56,50.55,50.55,50.56,50.55,50.56,50.56,50.56,
			50.56,50.56,50.56,50.56,50.56,50.56,50.56,50.56,50.56,50.56,50.56,50.56,50.56,50.56,50.57,50.56,
			50.56,50.57,50.56,50.57,50.57,50.57,50.56,50.56,50.57,50.57,50.57,50.57,50.57,50.57,50.57,50.57,50.57,
			50.57,50.57,50.57,50.57,50.57,50.57,50.57,50.57,50.57,50.57,50.57,50.57,50.58,50.58,50.58,50.58,50.58,
			50.58,50.58,50.58,50.58,50.58,50.58,50.58,50.58,50.58,50.58,50.58,50.58,50.58,50.58,50.59,50.58,
			50.59,50.59,50.58,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,
			50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.59,50.6,50.6,50.59,50.59,50.6
			,50.6,50.59,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,50.6,
			50.6,50.6,50.6,50.6,50.6,50.6,50.61,50.6,50.6,50.61,50.61,50.6,50.6,50.6,50.61,50.61,50.61,50.61,50.61,
			50.61,50.61,50.61,50.61,50.61,50.61,50.61,50.61,50.61,50.61,50.61,50.61,50.61,50.61,50.61,50.61
			,50.61,50.61,50.61,50.61,50.62,50.61,50.61,50.62,50.61,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,
			50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.62,
			50.62,50.62,50.62,50.62,50.62,50.62,50.61,50.62,50.62,50.62,50.62,50.62,50.62,50.62,50.63,50.62
			,50.62,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,
			50.63,50.63,50.63,50.62,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,
			50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.63,50.64,50.63,50.63,50.63,50.63,50.64,50.64
			,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,
			50.64,50.63,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.64,50.65,50.64,
			50.65,50.65,50.64,50.65,50.65,50.64,50.64,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65
			,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.65,50.67,
			50.68,50.68,50.68};
	
	private final double[] currentValues = 
		{0.3,0.3,0.4,0.1,0.3,0.3,0.3,0.1,0.3,0.3,0.4,0.3,0.3,0.3,0.3,0.3,0.3,0.4,0.4,0.4,0.4,0.3,0.3,0.3,0.3,
			0.3,0.3,0.4,0.3,0.3,0.3,0.3,0.3,0.3,0.4,0.3,0.3,0.4,0.3,0.3,0.4,54.4,104.1,141.4,177.4,244.1,175.3,-38.3,
			-23.3,-14.4,-12.5,0.1,0.3,0,0,0.1,0.1,0.1,0.1,0.1,0.1,0,66,5,4.7,1.5,1.1,3.2,0.6,0.3,31.1,113.4,133.5,
			152.7,173.5,233.1,217.8,195.8,175.7,15.3,57.8,3.5,-28.3,-20,-14.3,0,0.4,-0.1,0,0,0.4,0.3,0.3,-0.8,-0.1,
			-0.1,0,0,0,0,0,0,0,0,0.1,0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.1,0,0.1,0,-0.1,0,0,0.1,0.1,0,0.1,0.1,0,
			0.1,0,0.1,0.1,0,0,0.1,0,0,0,0,0,0,0.1,0,0,0,0,0,0,0.1,0,-0.1,0.1,0.1,0,0,0,0,0.1,0,0.1,0.1,0,0,0,0,0.1,
			0,0,0,0.1,0,0,0,0.1,0.1,0,0.1,0.1,0,0.1,0.1,0,0.1,0.1,0.1,0,0,0,0,0,0.1,0.3,0.1,0.1,0.1,0.1,0.1,0.1,
			0.1,0.1,0,0.3,0,0.1,0.1,0,0.1,0,0.1,0,0.1,0.1,0,0.1,0,0.1,0.1,0.1,0.1,0,0.1,0,0.1,0.1,16.2,-0.4,0.1,
			-0.3,0,0.1,0.1,0.1,0.1,0,0,0.1,0.1,0,0.1,24.3,18.4,13.7,8.7,4.7,11,11.8,11,16.6,4.7,6.4,0.3,-0.1,0.1,
			0.1,0,0.1,0,0.1,0.1,0,0,0.1,0,0,0.1,0,0.1,0.1,0,0.1,0,0.1,0.1,0.1,0,0,0,6,40.8,14.6,15.5,24.3,0.1,59.9,
			73.6,19.7,-0.3,-0.1,0.1,0.1,0.1,0.1,0.3,0.1,0.1,0.1,0.1,0.1,0.1,0,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,
			0.1,0.1,0,0,0.1,0.1,0.1,0.1,0.1,0.1,0.1,77.9,88.9,101.8,117.6,128.3,136.9,146.9,158.9,160.3,148,11.6,
			1.2,1.5,10.3,11.1,-4.9,19.4,20.8,15.4,12.2,6.5,0.6,-5.3,0,0.1,-0.1,-0.3,0.1,0,0.1,0.1,0.1,0.1,0,0.1,
			0.1,0,0.1,0,0.1,0,0,0.1,0,0.1,0.1,0.1,0.1,0,0,0,0.1,0,0,0,0,0,0,0.1,0.1,0.1,0,0.1,0.1,0,0,0,0,0.1,0.1,
			0.1,0.1,0.1,0,0.1,0,0.1,0,0,0.1,0.1,0.1,0.1,0.1,0.1,0.3,0,0.1,0.1,0.1,0.1,0.1,0.1,0.1,-0.1,4.9,0.8,0.8,
			0.1,0,-0.6,-0.4,-0.4,-0.4,-0.6,-1.2,0,-0.1,-0.6,-0.6,-0.6,-0.4,-0.4,-0.4,-0.6,-0.1,-0.6,-0.6,-0.4,-0.3,
			-0.6,0,-0.3,-0.1,-0.4,0,-0.3,0,0,0.4,0,0,-0.1,-0.3,0,-0.3,-0.1,-0.1,0.4,-0.6,-0.4,1.4,34.5,107.1,138.1,
			-8.5,-0.7,0,-3.5,0.1,-2.2,0.6,6.9,0.8,58.5,46.9,15.4,-1.2,-7.1,0.1,1865.6,-3.6,0.6,6,0.1,1.5,111.5,131.3,
			162.7,0,0.1,0.7,0.4,0.6,0.1,0.6,1.7,7.3,-0.3,-0.1,0.1,0,0.1,0.3,0,0.1,0,0.1,0,0,0,0,0,0.1,0,0.1,0,0,
			0.1,0.1,0.1,0,0,0,0,0.1,0,0.1,0.1,0,0.1,0,0,14.7,15.4,-0.4,0,-0.3,0.1,-0.4,-0.6,-0.6,-0.3,-0.1,0.1,0,
			0.1,0.1,0.1,0.1,0,0.1,0,0.1,0.1,0.1,0,0,-0.3,0,0.1,0.1,0,0,0.1,0,0,0,-0.1,-0.1,0,0,0,0,0,-0.1,0,0,0,
			0.1,0.1,0.1,0,0,0.1,0.1,0.1,0.1,0,0,0.1,0.1,0.1,0.1,0.1,0.1,0,0.1,0.1,0,0,0,0.1,0.1,0,0.1,0,0.1,0,0.1,
			0,0.1,0,0,0,0.1,0.1,0,0.1,0.1,0.1,0,0,0.1,0.1,0.1,0,0.1,0.1,0,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0,0.1,0.1,
			0.1,0,0,0.1,0,0.1,0.1,0.1,0.3,0,0.1,0,0.1,12.1,0.1,0,0.1,-0.8,25,6.5,38.3,109,142.7,0.1,-2.9,0.1,0.1,
			-0.1,0.1,0.1,0,0.1,-0.1,0,0,-0.1,-0.1,-0.3,-0.1,0.1,0.1,0.1,0.1,0.3,0.3,0.1,0.1,0.3,0.1,29.3,1.8,1.8,
			7.8,10.5,0.3,0,0,0,0,0.3,0,0.1,0.1,0,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.3,0.1,0,0,0.1,0.1,0,0.1,0.1,-0.6,
			-0.6,-0.7,-1,-0.8,-0.7,-0.7,-0.6,-0.7,-0.4,0.1,0.1,0.1,0.1,0.1,0.1,0.3,0.1,0.1,0.3,0.1,0.3,0.1,0.1,0.1,
			0.3,0.1,0,0.1,0.1,0.1,0.1,0,0.1,0.1,0,0.1,0.1,0.1,0.1,0.1,0.3,0.1,0.1,0,0,0.1,0.1,0,0.3,0.1,0.1,0,0.1,
			0,0.1,0.1,0.1,0,0,0.1,0.3,0.1,0.1,0.1,0.1,0,0,0.1,0,0.3,0.3,0,0,0.1,0.1,0.1,0.3,0.1,0.1,0.1,0.1,0.1,
			0,0.1,0.3,0.1,0.1,0.1,0.1,0,0.1,0.1,0.1,0.1,0.1,0.1,0.3,0.1,0.1,0.1,0.1,0,0.1,0,0,0.1,0.1,0,0.1,0,0,
			0.1,0.1,0,0.1,0,0,0.1,0,0,0,0.1,0.1,0,0,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0,0.1,0,0.1,0.1,0,0.1,0,0,0.1,0.1,
			0.1,0,0.1,0,0,0.1,0.1,0,0.1,0,0,0,0.1,0,0,0,0.1,0,0.1,0,0.1,0.3,0.1,0,0,0.1,0,0.1,0.1,0.1,0,0,0,0,0,
			0,0,0.1,0,0.1,0,0,0,0,0,0.1,0.1,0,0.1,0,0,0,0,0,0,0,0,0.1,0.1,0.1,0.1,0,0,0,0,0.1,0,0,0.1,-0.1,0.1,0,
			0,0,0,0,0.1,0,0.1,0.1,0,0,0,0,0,0.1,0,0.1,0.1,0.1,0,0,0,0,0,0,0,0,0.1,0,0,0.1,0,0.1,0.1,0,0,0,0,0,0,
			0,0,0,0.1,0,0,0,0.1,0,0,0,0.1,0,0,0,0,0.1,-0.1,0,0,0.1,0,0,0,0.1,0,0.1,-0.1,0,0,0.1,0,0,0,0,-0.1,0,0,
			0,0,-0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.1,0,-0.1,0,0,0,0,0.1,0,0,0,0,0,0,0,0,0,-0.1,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,0,0,0.1,0,0.1,0,0.1,0,0,0.1,0,0,-0.1,0,0,0,-0.1,-0.1,0,0,0.1,0.1,0,0,0,0,0,0,0,-0.1,
			0,0,0,0,0,0,-0.1,0,0.1,0,0,-0.1,0.1,0,0,0.1,0,0,-0.1,0,0,0,0,0,0,0,0,0,-0.1,0,-0.1,-0.1,0,0,0,0,0,0,
			0,0.1,0.1,0,0,0,0.1,0.1,0,0,0,-0.1,0,0,0,0,0,0,0.1,0,-0.1,0.1,0,0,0,0,0,0,0,0,0,-0.1,0,0,0,0,0,0,0,-0.1,
			0,0,-0.1,0,0,0,0,-0.1,0,0,0,0,0,-0.1,0,-0.1,0,-0.1,0,-0.1,0,0,0,0,0,0,0,0,0,0,0,0,-0.1,0,-0.1,-0.1,0,
			0.1,0,0,-0.1,0,0.3,0.4,0.3,0.4,0.4};
	
	private final double[] temperatureValues = {22.4,22.8,23.2,22.8,22.7,22.4};
	
	public HistoricalDataWrapper(){
		startTime = SystemClock.elapsedRealtime();
		toLog = false;
	}
	
	public HistoricalDataWrapper(String filename){
		logFile = getLogStorageDir(filename);
		startTime = SystemClock.elapsedRealtime();
		toLog = true;
		writeLogTitle();
	}
	
	private void writeLogTitle() {
		
		logUpdate.append(TIME_TITLE);
		logUpdate.append(LOG_COL_DELIMITER);
		
		logUpdate.append(SPEED_TITLE);
		logUpdate.append(LOG_COL_DELIMITER);

		logUpdate.append(VOLTAGE_TITLE);
		logUpdate.append(LOG_COL_DELIMITER);
		
		logUpdate.append(CURRENT_TITLE);
		logUpdate.append(LOG_COL_DELIMITER);
		
		logUpdate.append(MOTOR_TITLE);
		logUpdate.append(LOG_COL_DELIMITER);
		
		logUpdate.append(AMBIENT_TITLE);
		logUpdate.append(LOG_COL_DELIMITER);
		
		logUpdate.append(BATTERY_TITLE);
		logUpdate.append(LOG_COL_DELIMITER);
		
		logUpdate.append(CONTROLLER_TITLE);
		logUpdate.append(LOG_COL_DELIMITER);
		
		if(logLocation){
			
			logUpdate.append(LATITUDE_TITLE);
			logUpdate.append(LOG_COL_DELIMITER);
			
			logUpdate.append(LONGITUDE_TITLE);
			logUpdate.append(LOG_COL_DELIMITER);
			
			logUpdate.append(ALTITUDE_TITLE);
			logUpdate.append(LOG_COL_DELIMITER);
		}
		
		logUpdate.append(LOG_ROW_DELIMITER);
		
	}
	
	private File getLogStorageDir(String logname){
		File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),logname);
		return file;
	}
	
	@Override
	public String getSpeedString() {
		int n = (int)((SystemClock.elapsedRealtime()-startTime)/1000);
		return String.valueOf(speedValues[n%speedValues.length]);
	}

	@Override
	public String getVoltageString() {
		int n = (int)((SystemClock.elapsedRealtime()-startTime)/1000);
		return String.valueOf(voltageValues[n%voltageValues.length]);
	}

	@Override
	public String getCurrentString() {
		int n = (int)((SystemClock.elapsedRealtime()-startTime)/1000);
		latestCurrent = (currentValues[n%currentValues.length]);
		return String.valueOf(latestCurrent);
	}

	@Override
	public String getMotorString() {
		int n = (int)((SystemClock.elapsedRealtime()-startTime)/1000);
		return String.valueOf(temperatureValues[n%temperatureValues.length]);
	}

	@Override
	public String getBatteryString() {
		int n = (int)((SystemClock.elapsedRealtime()-startTime)/1000);
		return String.valueOf(temperatureValues[n%temperatureValues.length]);
	}

	@Override
	public String getAmbientString() {
		int n = (int)((SystemClock.elapsedRealtime()-startTime)/1000);
		return String.valueOf(temperatureValues[n%temperatureValues.length]);
	}

	@Override
	public String getControllerString() {
		int n = (int)((SystemClock.elapsedRealtime()-startTime)/1000);
		return String.valueOf(temperatureValues[n%temperatureValues.length]);
	}

	//Not actually used
	@Override
	public void writeEmptySignal() {
		return;
	}

	public void updateLogs() throws Exception{
long currTime = SystemClock.elapsedRealtime();
		
		if(toLog && currTime - lastLogTime > logFrequency){
			logUpdate.append(getSpeedString());
			logUpdate.append(LOG_COL_DELIMITER);
			
			logUpdate.append(getVoltageString());
			logUpdate.append(LOG_COL_DELIMITER);
			
			logUpdate.append(getCurrentString());
			logUpdate.append(LOG_COL_DELIMITER);
			
			logUpdate.append(getMotorString());
			logUpdate.append(LOG_COL_DELIMITER);
			
			logUpdate.append(getAmbientString());
			logUpdate.append(LOG_COL_DELIMITER);
			
			logUpdate.append(getBatteryString());
			logUpdate.append(LOG_COL_DELIMITER);
			
			logUpdate.append(getControllerString());
			logUpdate.append(LOG_COL_DELIMITER);
			
			if(logLocation){
				logUpdate.append(location.getLatitude());
				logUpdate.append(LOG_COL_DELIMITER);
				
				logUpdate.append(location.getLongitude());
				logUpdate.append(LOG_COL_DELIMITER);
				
				logUpdate.append(location.getAltitude());
				logUpdate.append(LOG_COL_DELIMITER);
			}
			
			logUpdate.append(LOG_ROW_DELIMITER);
			
			lastLogTime = SystemClock.elapsedRealtime(); 
		}
		
		if(toLog && currTime - lastBackupTime > backupFrequency){
			
			FileWriter logFileWriter = new FileWriter(logFile,true);
			
			logFileWriter.append(logUpdate.toString());

			logFileWriter.flush();
			logFileWriter.close();
			
			logUpdate = new StringBuilder();
			
			lastBackupTime = SystemClock.elapsedRealtime();
		}
		
	}

	@Override
	public void updateData(byte[] data) {
		updateCapacity();
		updateTime();
		return;
	}
	
	public int getMaxCapacity(){
		return MAX_BATTERY_CAPACITY;
	}
	
	public int getBattCapacity(){
		return (int) batteryCapacity;
	}

	@Override
	public String getCapacityString() {
		return String.valueOf((int)batteryCapacity*100/MAX_BATTERY_CAPACITY);
	}

	@Override
	public void updateInitialCapacity(byte[] data) {
		int capacityInteger = 0;
		for(int i = 0; i < BYTES_IN_INT; i++){
			int shift = (BYTES_IN_INT - 1 - i) * BITS_IN_BYTE;
	    	capacityInteger += (data[i] & BITMASK) << shift;
	    }
		initialCapacity = capacityInteger;
		batteryCapacity = initialCapacity;
		chargeConsumed = 0;
		startTime = SystemClock.elapsedRealtime();
		lastLogTime = startTime;
		lastBackupTime = startTime;
	}
	
	private void updateCapacity(){
		//L.d("battery capacity is " + batteryCapacity);
		if (_timeList.size()>1){
			int latestTime = _timeList.size()-1;
			chargeConsumed += ((_timeList.get(latestTime) - _timeList.get(latestTime-1)) * 
					latestCurrent);
			batteryCapacity = initialCapacity - chargeConsumed;
		}
	}
	
	private void updateTime(){
		_timeList.add((int)(SystemClock.elapsedRealtime()-startTime));
	}
	
	@Override
	public void setLogFrequency(int freq) {
		logFrequency = freq;
	}

	@Override
	public void setBackupFrequency(int freq) {
		backupFrequency = freq * 60 * 60;
	}
	
	@Override
	public void write(byte[] data){
		//
	}
	
	@Override
	public void setLocation(Location loc) {
		location = loc;
		if (toLog){
			logLocation = true;
		}
	}
	
	@Override
	public void enableLocationLogging(){
		if (toLog){
			logLocation = true;
		}
	}
}
